﻿using System.Collections.Generic;
using DTO;
using DTO.Reports;


namespace DataAccessLayer
{
    
    using System;
    
    /// <summary>
    /// Интерфейс специфицирует провайдер для доступа к данным
    /// </summary>
    public partial interface IDataProvider
    {
        /// <summary>                                                                                        
        /// Получить список периодов                                                                         
        /// </summary>                                                                                       
        /// <returns>Коллекция периодов</returns>                                                            
        IEnumerable<DTO.Term> GetTerms();

        IEnumerable<DTO.Organization> GetOrganizations();
        IEnumerable<DTO.Period> GetPeriods();                                                                                                                                                                     
        /// <summary>                                                                                        
        /// Получить дерево для периода                                                                      
        /// </summary>                                                                                       
        /// <param name="TermID">ID периода</param>                                                          
        /// <returns>Коллекция разделов с дочерними элементами</returns>                                     
        IEnumerable<DTO.Section> GetSectionForTree(int TermID);                       
                                                                                                                
        /// <summary>                                                                                        
        /// Получить респондентов и их ответы по периоду
        /// </summary>
        /// <param name="IDCharTerm">IDCharTerm</param>
        /// <param name="IDDep">ID отдела. Может быть null</param>
        /// <returns>Коллекция респондентов с ответами</returns>
        IEnumerable<DTO.RespondentAnswers> GetRespAnswers(int IDCharTerm, Nullable<int> IDDep);
        
        /// <summary>
        /// Получить ответы по показателю для заданного респондента
        /// </summary>
        /// <param name="IDCharTerm">ID показателя в периоде</param>
        /// <param name="RespID">ID реапондента</param>
        /// <returns>Коллекция показателей</returns>
        DTO.RespondentAnswers GetAnswersByCharAndResp(int IDCharTerm, int RespID);

        /// <summary>
        /// Сохраняет список ответов в БД
        /// </summary>
        /// <param name="list">Коллекция ответов</param>
        void SaveAnswers(DTO.RespondentAnswers RA, String UserName);

        /// <summary>
        /// получить SID должности для проверки прав пользователя
        /// </summary>
        /// <param name="IDChar"></param>
        /// <param name="IDTerm"></param>
        /// <returns>Security Identifier</returns>
        string GetSID(int IDChar, int IDTerm);

        /// <summary>
        /// получить SID супервайзера
        /// </summary>
        /// <returns>SID супервайзера</returns>
        string GetSupervisorSID();

        /// <summary>
        /// получить список всех кафедр и факультетов по периоду
        /// </summary>
        /// <param name="IDTerm">ID периода</param>
        /// <returns>список кафедр</returns>
        IEnumerable<DTO.Department> GetDepartmentsList(int IDTerm);

        /// <summary>
        /// Получить индексы
        /// </summary>
        /// <param name="TermID">ID периода</param>
        /// <param name="Cats">Список категорий, которые мы исключаем из расчета</param>
        /// <param name="Chars">Список показателей, которые мы исключаем из расчета</param>
        /// <param name="Respondents">Список респондентов, которые мы исключаем из расчета</param>
        /// <returns>Индексы</returns>
        IEnumerable<DTO.IndexRow> GetIndexes(int TermID, IEnumerable<int> Cats, 
            IEnumerable<int> Chars, IEnumerable<int> Respondents, 
            DTO.IndexListType Type, DTO.IndexStrategyType Strategy);

        /// <summary>
        /// получает список ролей пользователя
        /// </summary>
        /// <param name="ListSID">список сидов</param>
        /// <returns>список ролей пользователя</returns>
        IEnumerable<String> GetRoles(IList<String> ListSID);

        /// <summary>
        /// возвращает, является ли пользователь ответственным по заданному показателю
        /// </summary>
        /// <param name="IDCharTerm"></param>
        /// <param name="SIDs">список SID-ов пользователя</param>
        /// <returns>является ли пользователь ответственным по заданному показателю</returns>
        bool IsResponsible(int IDCharTerm, IEnumerable<String> SIDs);

        /// <summary>
        /// получить возможность сохранения ответов по заданным респонденту и показателю
        /// </summary>
        /// <param name="CharTermID"></param>
        /// <param name="RespID"></param>
        /// <param name="SIDs">список SID-ов пользователя</param>
        /// <returns>возможность сохранения ответов по респонденту</returns>
        bool IsResponsible(int CharTermID, int RespID, IEnumerable<String> SIDs);

        bool IsVisibleForAll(int IDCharTerm);

        void AddInputLog(String UserName);

        void CopyPersonDegrees(int fromIDTerm, int toIDTerm);

        /// <summary>
        /// Возвращает список категорий
        /// </summary>
        /// <returns>Списко категорий</returns>
        IEnumerable<DTO.Category> GetCategories(int TermID);

        IEnumerable<DTO.Permission> GetPermissions(IEnumerable<string> SIDs, int IDTerm);

        IEnumerable<DTO.Gradation> GetGradations(int CharTermID);

        IEnumerable<Department> GetUSTUTree(int TermID);

        IEnumerable<DTO.Money> GetPremiums(int TermID, DTO.IndexStrategyType Strategy);


        /// <summary>
        /// Получает список нулевых характеристик
        /// </summary>
        /// <param name="TermID"></param>
        /// <returns></returns>
        IEnumerable<DTO.Reports.NullChar> GetNullableChars(int TermID);

        /// <summary>
        /// Получает список должностей
        /// </summary>
        /// <returns></returns>
        IEnumerable<DTO.Position> GetPositionList();


        /// <summary>
        /// Получает список корневых разделов
        /// </summary>
        /// <param name="TermID"></param>
        /// <returns></returns>
        IEnumerable<DTO.Section> GetParentsSections(int TermID);

        IEnumerable<DTO.IndexRow> GetLIDIA(int TermID, int[] RespID);

        IEnumerable<DTO.Reports.VolumsPPS> GetVolumsPPS(int termId, IEnumerable<int> respondents, IEnumerable<int> cats, IEnumerable<int> sections);

        IEnumerable<DTO.Reports.VolumePPS> GetOrderedVolums(int IDCharGradTerm);

        IEnumerable<DTO.Section> GetISTree(int TermID);
    }
}
